package 设计模式.创建型.工厂模式.简单工厂模式.加入多态替换if判断五;


import 设计模式.创建型.工厂模式.简单工厂模式.IRuleConfigParser;
import 设计模式.创建型.工厂模式.简单工厂模式.InvalidRuleConfigException;
import 设计模式.创建型.工厂模式.简单工厂模式.RuleConfig;

/**
 *
 * 这里虽然在工厂方法的实现来看，一切都很完美，
 * 但是问题存在于这些工厂类的使用上。
 * 如何用这些工厂类来实现 RuleConfigSource 的 load() 函数。
 * 把 if 判断转移到了使用端
 *
 * 处理办法是：我们可以为工厂类再创建一个简单工厂，也就是工厂的工厂，用来创建工厂类对象。
 */

public class RuleConfigSource {
    public RuleConfig load(String ruleConfigFilePath) throws InvalidRuleConfigException {

        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);

        IRuleConfigParserFactory parserFactory = null;
        if ("json".equalsIgnoreCase(ruleConfigFileExtension)) {
            parserFactory = new JsonRuleConfigParserFactory();
        } else if ("xml".equalsIgnoreCase(ruleConfigFileExtension)) {
            parserFactory = new XmlRuleConfigParserFactory();
        } else if ("yaml".equalsIgnoreCase(ruleConfigFileExtension)) {
            parserFactory = new YamlRuleConfigParserFactory();
        } else if ("properties".equalsIgnoreCase(ruleConfigFileExtension)) {
            parserFactory = new PropertiesRuleConfigParserFactory();
        } else {
            throw new InvalidRuleConfigException("Rule config file format is not supported: " + ruleConfigFilePath);
        }
        IRuleConfigParser parser = parserFactory.createParser();

        if (parser == null) {
            throw new InvalidRuleConfigException(
                    "Rule config file format is not supported: " + ruleConfigFilePath);
        }

        String configText = "";

        return parser.parse(configText);
    }

    private String getFileExtension(String filePath) {
        //...解析文件名获取扩展名，比如rule.json，返回json
        return "json";
    }
}
